#!/bin/bash

# LD_ICM程序启动脚本（含自动重启守护）
# 用于演示不同的启动方式和日志控制

PROGRAM_NAME="multi_thread_program"
PROGRAM_PATH="./$PROGRAM_NAME"
PID_FILE="/var/run/ldcicm.pid"
DAEMON_PID_FILE="/var/run/ldcicm_daemon.pid"
LOG_FILE="/var/log/ldcicm_console.log"
RESTART_DELAY=2
MAX_RESTARTS=0   # 0 表示不限制，正数表示最大重启次数

# 检查程序是否存在
if [ ! -f "$PROGRAM_PATH" ]; then
    echo "错误: 找不到程序文件 $PROGRAM_PATH"
    exit 1
fi

start_foreground() {
    echo "启动前台调试模式..."
    echo "控制台输出: 启用（自动检测）"
    echo "日志级别: DEBUG"
    echo "按 Ctrl+C 停止程序"
    echo "----------------------------------------"
    exec $PROGRAM_PATH debug --console-auto
}

run_once_background() {
    nohup $PROGRAM_PATH info --console-auto >> "$LOG_FILE" 2>&1 &
    echo $! > "$PID_FILE"
}

start_daemon_loop() {
    echo "启动后台守护进程模式（自动重启）..."

    # 检查是否已经在运行
    if [ -f "$DAEMON_PID_FILE" ]; then
        DPID=$(cat "$DAEMON_PID_FILE")
        if kill -0 "$DPID" 2>/dev/null; then
            echo "守护进程已在运行 (PID: $DPID)"
            exit 1
        else
            echo "删除过期的守护进程PID文件"
            rm -f "$DAEMON_PID_FILE"
        fi
    fi

    # 创建日志目录
    mkdir -p "$(dirname "$LOG_FILE")"

    # 后台运行守护循环
    (
        echo $$ > "$DAEMON_PID_FILE"
        echo "控制台输出: 自动禁用（后台运行）"
        echo "日志级别: INFO"
        echo "控制台日志文件: $LOG_FILE"
        echo "系统日志文件: /root/user_data/sysl_log/"

        restart_count=0
        while true; do
            # 启动子进程
            echo "启动子进程..."
            $PROGRAM_PATH info --console-auto >> "$LOG_FILE" 2>&1 &
            CPID=$!
            echo $CPID > "$PID_FILE"
            echo "子进程PID: $CPID"

            # 等待子进程退出
            wait $CPID
            exit_code=$?
            echo "子进程退出，退出码: $exit_code"

            # 清理子进程PID文件
            rm -f "$PID_FILE"

            # 判断是否异常退出（128-255 通常为信号导致或自定义异常码）
            if [ $exit_code -ge 128 ] && [ $exit_code -le 255 ]; then
                echo "检测到异常退出（退出码=$exit_code），将在 $RESTART_DELAY 秒后重启"
                restart_count=$((restart_count + 1))
                if [ $MAX_RESTARTS -gt 0 ] && [ $restart_count -gt $MAX_RESTARTS ]; then
                    echo "已达到最大重启次数($MAX_RESTARTS)，停止守护"
                    break
                fi
                sleep $RESTART_DELAY
                continue
            else
                echo "检测到正常退出（退出码=$exit_code），停止守护"
                break
            fi
        done

        rm -f "$DAEMON_PID_FILE"
        echo "守护进程退出"
    ) >/dev/null 2>&1 &

    echo "守护进程已启动 (PID: $!)"
}

start_daemon() {
    # 兼容旧的单次启动（不自动重启）
    echo "启动后台（单次）..."
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if kill -0 "$PID" 2>/dev/null; then
            echo "程序已在运行 (PID: $PID)"
            exit 1
        else
            echo "删除过期的PID文件"; rm -f "$PID_FILE"
        fi
    fi
    mkdir -p "$(dirname "$LOG_FILE")"
    echo "控制台输出: 自动禁用（后台运行）"
    echo "日志级别: INFO"
    echo "控制台日志文件: $LOG_FILE"
    echo "系统日志文件: /root/user_data/sysl_log/"
    run_once_background
    sleep 2
    if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
        echo "程序启动成功"
    else
        echo "程序启动失败，请检查日志: $LOG_FILE"
        rm -f "$PID_FILE"; exit 1
    fi
}

start_daemon_with_console() {
    echo "启动后台模式（保持控制台输出）..."
    echo "注意: 这种模式会持续输出到控制台，不推荐长期运行"
    echo "控制台输出: 强制启用"
    echo "日志级别: DEBUG"
    nohup $PROGRAM_PATH debug --console-on >> "$LOG_FILE" 2>&1 &
    echo $! > "$PID_FILE"
    echo "程序已启动 (PID: $(cat "$PID_FILE"))，控制台输出保存到: $LOG_FILE"
}

stop_daemon() {
    stopped=0
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if kill -0 "$PID" 2>/dev/null; then
            echo "停止子进程 (PID: $PID)..."
            kill -TERM "$PID"
            for i in {1..10}; do
                if ! kill -0 "$PID" 2>/dev/null; then
                    echo "子进程已停止"; rm -f "$PID_FILE"; stopped=1; break
                fi
                sleep 1
            done
            if [ $stopped -eq 0 ]; then
                echo "强制停止子进程..."; kill -KILL "$PID" 2>/dev/null; rm -f "$PID_FILE"; stopped=1
            fi
        else
            rm -f "$PID_FILE"
        fi
    fi

    if [ -f "$DAEMON_PID_FILE" ]; then
        DPID=$(cat "$DAEMON_PID_FILE")
        if kill -0 "$DPID" 2>/dev/null; then
            echo "停止守护进程 (PID: $DPID)..."
            kill -TERM "$DPID" 2>/dev/null
            sleep 1
            if kill -0 "$DPID" 2>/dev/null; then
                echo "强制停止守护进程..."; kill -KILL "$DPID" 2>/dev/null
            fi
        fi
        rm -f "$DAEMON_PID_FILE" 2>/dev/null
    fi
}

status() {
    if [ -f "$DAEMON_PID_FILE" ] && kill -0 "$(cat "$DAEMON_PID_FILE")" 2>/dev/null; then
        echo "守护进程正在运行 (PID: $(cat "$DAEMON_PID_FILE"))"
    else
        echo "守护进程未运行"
    fi
    if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
        echo "子进程正在运行 (PID: $(cat "$PID_FILE"))"
        echo "内存使用情况:"; ps -p "$(cat "$PID_FILE")" -o pid,ppid,pcpu,pmem,vsz,rss,comm
    else
        echo "子进程未运行"
    fi
}

show_logs() {
    echo "=== 控制台日志 (最后50行) ==="
    if [ -f "$LOG_FILE" ]; then
        tail -n 50 "$LOG_FILE"
    else
        echo "控制台日志文件不存在: $LOG_FILE"
    fi
    echo ""; echo "=== 系统日志文件 ==="
    LOG_DIR="/root/user_data/sysl_log"
    if [ -d "$LOG_DIR" ]; then
        echo "日志目录: $LOG_DIR"
        ls -la "$LOG_DIR"/*.log 2>/dev/null | head -5
        echo ""; echo "最新日志文件内容 (最后20行):"
        LATEST_LOG=$(ls -t "$LOG_DIR"/*.log 2>/dev/null | head -1)
        if [ -n "$LATEST_LOG" ]; then tail -n 20 "$LATEST_LOG"; else echo "没有找到系统日志文件"; fi
    else
        echo "系统日志目录不存在: $LOG_DIR"
    fi
}

case "$1" in
    start)
        start_daemon
        ;;
    start-fg)
        start_foreground
        ;;
    start-console)
        start_daemon_with_console
        ;;
    start-loop)
        start_daemon_loop
        ;;
    stop)
        stop_daemon
        ;;
    restart)
        stop_daemon; sleep 2; start_daemon
        ;;
    status)
        status
        ;;
    logs)
        show_logs
        ;;
    *)
        echo "用法: $0 {start|start-fg|start-console|start-loop|stop|restart|status|logs}"
        echo ""
        echo "命令说明:"
        echo "  start         - 启动后台（单次，不自动重启）"
        echo "  start-fg      - 启动前台调试模式（用于开发调试）"
        echo "  start-console - 启动后台模式但保持控制台输出（不推荐长期运行）"
        echo "  start-loop    - 启动后台守护循环（异常退出自动重启）"
        echo "  stop          - 停止程序和守护进程"
        echo "  restart       - 重启程序（单次模式）"
        echo "  status        - 查看程序与守护进程状态"
        echo "  logs          - 查看日志文件"
        exit 1
        ;;
 esac 